// 先写构造函数
function Vue(options) {
    this.$data = this._data = options.data

    // 实现数据劫持，给对象的每个属性都添加一个get和set
    observe(this.$data)
}

// 这个函数用来做数据劫持
function observe(obj) {
    //6. 判断传入的数据是否是对象,条件结束，不向下执行了,递归终止条件
    if (!obj || typeof obj !== 'object') return

    //1. 获取传入的数据，遍历传进来的数据
    Object.keys(obj).forEach(key => {

        // 3. 获取当前属性原来的值，保存到一个变量中
        let oldValue = obj[key]

        // 5.进行递归调用实现深度劫持(对象中传递对象)
        observe(oldValue)

        // 2.给每个属性添加get和set方法
        Object.defineProperty(obj, key, {

            // 4.给每个属性的get和set函数中添加代码实现劫持
            get() {
                return oldValue
            },
            set(value) {
                // 修改触发set，会被重新赋值
                oldValue = value
            }
        })
    })
}